Skip to content

ECMAScript 按类别分类(ES2015~最新)

本文按 语言特性类别 归纳,便于查阅与对照梳理。同一 API 可能跨多个版本迭代,括号内标注大致引入版本;具体以 TC39 Finished Proposals 与 MDN 为准。

命名说明:日常说的「ES6」多指 ES2015;此后每年 6 月发布 ES2016、ES2017…。下文统称 现代 JS / ES2015+,不单指 2015。


一、语法层:变量、解构、展开与字面量

1. 块级作用域声明(ES2015)

特性说明
let块级作用域;不存在同一块内重复声明;存在暂时性死区(TDZ)
const块级常量绑定;必须初始化;对对象/数组保存的是引用不可变(内容仍可改)

2. 解构赋值(ES2015)

  • 数组解构const [a, b = 1, ...rest] = arr
  • 对象解构const { x, y: rename, z = 3 } = obj
  • 嵌套解构默认值、与函数参数结合(见下文)

3. 剩余与展开(ES2015)

运算符场景
剩余 ...rest函数参数、数组/对象解构末尾收集剩余项
展开 ...iterable数组字面量、函数调用参数列表
对象展开 { ...obj }ES2018,浅拷贝与合并对象

4. 模板字面量(ES2015)

  • 反引号 `、多行字符串、${expr} 插值
  • 标签模板tag`hello ${x}` → 调用函数 tag(strings, ...values)

5. 简洁语法(ES2015)

  • 对象方法简写 { foo() {} }、属性名简写 { a }
  • 计算属性名{ [key]: v }

6. 可选链与空值合并(ES2020)

运算符含义
?.短路访问:obj?.a?.barr?.[0]fn?.()
??仅当左侧为 nullundefined 时取右侧(与 || 区分)

7. 逻辑赋值(ES2021)

&&=||=??=:读改写运算并赋回同一引用。

8. 数字分隔符(ES2021)

1_000_0000xFF_FF,提升可读性(不影响值)。

9. 类相关语法(ES2015 + 后续)

  • ES2015classextendssuper、静态方法 static
  • ES2022:私有字段/方法 #field#method()静态块 static { }
  • ES2022 / ES2023公有类字段私有类字段、静态私有(依提案阶段与引擎支持)

10. 装饰器 Decorators(ES2024 纳入标准)

类、方法、字段、getter/setter、访问器的 @decorator 语法(需构建工具或新版引擎支持)。


二、函数

1. 默认参数、剩余参数(ES2015)

js
function f(a = 1, ...rest) {}
  • 默认参数后的形参无自身默认值时,对 arguments 行为需注意;默认参数存在 TDZ

2. function.name / function.length(ES2015 规范化)

  • length首个默认参数之前的形参个数。
  • name:推断名称(含赋值给变量的函数表达式等)。

3. 箭头函数(ES2015)

  • 无自身 this / arguments / super / new.target,继承外层词法环境。
  • 不能作构造函数(无 prototype、不可用 new)。
  • 简洁返回:x => x * 2

4. 尾后逗号(ES2017)

函数调用、函数声明、数组、对象字面量末尾逗号合法,便于 Git diff。


三、对象

1. 静态方法(Object 命名空间)(节选)

方法版本作用
Object.assign(target, ...sources)ES2015浅拷贝可枚举自有属性到 target
Object.is(a, b)ES2015同值判断(NaN+0/-0 行为与 === 不同)
Object.keys / values / entriesES2015 / ES2017枚举键、值、键值对数组
Object.getOwnPropertyDescriptors(obj)ES2018用于配合 Object.defineProperties 做拷贝
Object.fromEntries(iterable)ES2019[[k,v],…] → 对象,与 entries 互逆
Object.hasOwn(obj, key)ES2022建议替代 Object.prototype.hasOwnProperty.call

2. __proto__ 与原型(ES2015)

  • 标准化 Object.getPrototypeOf / setPrototypeOf 为主流用法。

四、数组与类数组

1. 静态方法

方法版本说明
Array.from(arrayLike[, mapFn[, thisArg]])ES2015类数组/可迭代 → 真数组;可映射
Array.of(...items)ES2015避免 Array(7)Array(7,8) 歧义

2. 实例方法(变更原数组 / 返回新数组)

会修改原数组(节选)sortsplicereversefillcopyWithin 等。

ES2015+ 常用新增

方法版本说明
find / findIndexES2015条件查找 / 下标
fill / copyWithinES2015填充 / 区内复制
includesES2016NaN 可正确判断
flat / flatMapES2019扁平化 / 映射后扁平一层
findLast / findLastIndexES2023从后往前查找

ES2023 不可变语义(返回新数组)

方法说明
toReversed()不修改原数组的反转
toSorted(compareFn?)不修改原数组的排序
toSpliced(start, deleteCount, ...items)不修改原数组的 splice 语义
with(index, value)指定下标替换为新值的新数组

3. 迭代方法(ES2015)

  • keys()values()entries() 返回 迭代器(配合 for...of)。

4. Array.prototype.sort 说明

  • sort 早已存在,ES2015 起规范要求排序算法稳定(由实现保证);不可变排序请用 ES2023toSorted

5. Array.fromAsync(ES2024)

异步迭代或可迭代异步源 → Promise<数组>


五、字符串

1. ES2015

  • Unicode 码点:codePointAtString.fromCodePoint
  • includesstartsWithendsWithrepeat
  • normalize(Unicode 正规化)

2. 后续版本(节选)

方法版本
padStart / padEndES2017
trimStart / trimEnd(别名 trimLeft / trimRightES2019
matchAll(返回迭代器,配合 g 标志)ES2020
replaceAllES2021
at(支持负数下标)ES2022

3. 内置对象 String.raw(ES2015)

标签模板中取得原始字符串片段。


六、数值、MathBigInt

1. Number 扩展(ES2015)

Number.isFiniteNumber.isNaNNumber.isIntegerNumber.EPSILONNumber.MAX_SAFE_INTEGERNumber.MIN_SAFE_INTEGERNumber.isSafeInteger

2. Math 新增(ES2015 等)

truncsigncbrthypotimulclz32 等一组数学工具。

3. BigInt(ES2020)

任意精度整数:123n;与 Number 混算需显式转换。


七、Symbol

1. 基本(ES2015)

  • Symbol()Symbol.for / Symbol.keyFor
  • 对象唯一属性键、避免名称冲突

2. Well-Known Symbols(节选)

Symbol.iteratorSymbol.toStringTagSymbol.asyncIterator(ES2018)等,用于协议挂载。

3. Symbol.prototype.description(ES2019)

只读描述字符串。


八、集合类型:MapSetWeakMapWeakSet

1. Map / Set(ES2015)

  • 任意类型键(Map)、值唯一(Set
  • 迭代顺序为插入顺序;具备 sizeclear、迭代器协议

2. WeakMap / WeakSet(ES2015)

  • 弱引用键(对象);不可枚举全部键;适合元数据、私有实现细节

3. 实例方法扩展(后续)

Set 上的集合运算ES2025 提案中补充 union / intersection / difference 等(以引擎支持为准)。


九、迭代协议、生成器与 for...of

1. 协议(ES2015)

  • 可迭代协议Symbol.iterator
  • 迭代器协议next() 返回 { value, done }

2. 生成器(ES2015)

function*yieldyield*;可用于惰性序列、简化异步(历史上也曾与协程风格结合)。

3. for...of(ES2015)

遍历可迭代对象(默认不含普通对象,对象需配合 Object.keys 等)。

4. 异步迭代(ES2018)

  • Symbol.asyncIterator
  • for await...of:遍历异步可迭代源

十、Promise 与异步流程

1. Promise(ES2015)

Promise.resolve / rejectthencatchallrace

2. 静态方法扩展

方法版本行为摘要
finallyES2018无论 fulfilled / rejected 都执行
allSettledES2020全部落定,含理由
anyES2021任一成功;全失败则 AggregateError
withResolversES2024返回 { promise, resolve, reject }

3. async / await(ES2017)

基于 Promise 的同步写法;await 可接 Thenable。

4. 顶层 await(ES2022)

模块顶层可直接 await,用于加载依赖或异步初始化。

5. import() 动态导入(ES2020)

返回 Promise,用于代码分割与按需加载。


十一、模块:import / export(ES2015)

  • 静态:编译期结构、export / import* asdefault
  • 动态import('./mod.js')
  • JSON 模块Import Attributes 等由宿主与后续标准扩展(需构建链配置)

十二、ProxyReflect(ES2015)

API作用
Proxy拦截对象操作(读写属性、函数调用、indelete 等)
Reflect与 Handler trap 一一对应的默认行为封装,返回布尔/结果便于处理

常用于响应式框架、不可变代理、API 兼容层。


十三、正则表达式

1. ES2015

  • u(Unicode)、y(sticky)
  • flags 属性、RegExp 构造可写 flags

2. ES2018

  • 命名捕获组 (?<name>...)
  • dotAll s. 匹配换行
  • 后行断言 (?<=)(?<!)

3. ES2019 / ES2020

  • String.prototype.matchAll 与正则迭代
  • String.prototype.replace 结合命名组替换

4. ES2024

  • v 标志unicodeSets):Unicode 属性类、集合运算更完整(与 u 二选一使用场景见 MDN)

十四、globalThis(ES2020)

在浏览器、Node、Worker 等环境统一获取全局对象。


十五、JSON

  • ES2019:JSON 作为 ECMA-262 的子规范明确纳入(语法层面约束更一致);常用仍是 JSON.parse / JSON.stringify(方法本身更早即有)。

十六、错误与 Error.prototype.cause(ES2022)

链式错误原因:throw new Error('wrap', { cause: originalError }),便于排查异步/封装层次。


十七、分组归约:Object.groupBy / Map.groupBy(ES2024)

按回调返回值分组;Map 版本适用于对象键非字符串场景。


十八、国际化 Intl(演进多年)

非单次 ES 版本一次性引入:Intl.DateTimeFormatIntl.NumberFormatIntl.RelativeTimeFormat(ES2018)、Intl.ListFormatIntl.DisplayNames 等随 ECMA-402 迭代。常见要点:本地化格式化与时区。


十九、与「按时间线」文档的配合使用

  • 查「哪一年加了什么」:见同目录 [01、ES6 按时间线分类](./01、ES6 按时间线分类.md)
  • 查「某一类 API 有哪些」:以本文类别为准,并按需跳转 MDN / 提案原文。

附录:文档修正说明

  1. Object.fromEntries:作用是把 [ [key, val], ... ] 转成对象,不是「返回键值对」。
  2. Array.prototype.sort:不是 ES6 才新增的方法;不可变排序请使用 toSorted(ES2023)
  3. 装饰器:早期多为 TS / Babel 实验语法;ES2024 起有标准语法路径,实际项目需看 TS 版本与构建配置